﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace Cataloger
{
    /// <summary>
    /// Klasa opisująca Folder (strukturę danych gromadzącą
    /// Pliki i Foldery (podfoldery)). Dziedziczy ona po klasie
    /// abstrakcyjne ObiektDyskowy
    /// </summary>
    [Serializable]
    public class Folder : ObiektDyskowy
    {
		#region Fields (2) 

        List<Plik> pliki=new List<Plik>();
        List<Folder> podfloldery=new List<Folder>();

		#endregion Fields 

		#region Constructors (2) 

        public Folder(DirectoryInfo directory)
        {
            this.sciezka = directory.FullName;
            this.atrybuty = directory.Attributes;
            this.dataDost = directory.LastAccessTime;
            this.dataUtw = directory.CreationTime;
            this.dataMod = directory.LastWriteTime;
        }

        public Folder()
        {
        }

		#endregion Constructors 

		#region Properties (5) 

        /// <summary>
        /// Podaje liczbę plików w folderze z najwyższego poziomu
        /// </summary>
        /// <value>Liczbe plików w folderze</value>
        public long LiczbaPlikow
        {
            get { return pliki.Count; }
        }

        /// <summary>
        /// Podaje liczbę podfolderów w folderze z najwyższego poziomu
        /// </summary>
        /// <value>Liczbe podfolderow w folderze</value>
        public long LiczbaPodfolderow
        {
            get { return podfloldery.Count; }
        }

        public List<Plik> Pliki
        {
            get { return pliki; }
        }

        public List<Folder> Podflodery
        {
            get { return podfloldery; }
        }

        /// <summary>
        /// Podaje rozmiar wszystkich plików znajdujących się w Folderze
        /// </summary>
        public override long Rozmiar
        {
            get
            {
                return rozmiarRek(this);
            }

        }

		#endregion Properties 

		#region Methods (6) 

		// Public Methods (4) 

         public override string CalkowiteInfo()
         {
             StringBuilder st = new StringBuilder();
             st.AppendLine("Nazwa: \t\t" + this.Nazwa);
             st.AppendLine("Sciezka: \t" + this.sciezka);
             st.AppendLine("Rozmiar: \t" + this.Rozmiar.ToProperUnit());
             st.AppendLine("Data utw: \t" + this.dataUtw.ToShortDateString() + "  " + this.dataUtw.ToShortTimeString());
             st.AppendLine("Data mod: \t" + this.dataMod.ToShortDateString() + "  " + this.dataMod.ToShortTimeString());
             st.AppendLine("Data dos: \t" + this.dataDost.ToShortDateString() + "  " + this.dataDost.ToShortTimeString());
             st.AppendLine("Atrybuty: \t" + this.atrybuty.ToString());
             st.AppendLine("Nosnik: \t" + this.Nosnik.Nazwa);
             st.AppendLine("Katalog: \t" + this.KataloG.Nazwa);
             st.AppendLine("Podfoldery: \t" + this.LiczbaPodfolderow.ToString());
             st.AppendLine("Pliki: \t\t" + this.LiczbaPlikow.ToString());
             return st.ToString();
         }

         public override string ToString()
         {
             return Sciezka;
         }

        public override void UstawKategorie(Kategoria kat)
        {
            PrzydzielKategorie(this, kat);
        }

        /// <summary>
        /// Wyswietla pliki z danego folderu na kontrolce ListView
        /// </summary>
        /// <param name="listView1">The list view1.</param>
         public void WyswietlListePikow(ListView listView1)
         {
             foreach (Plik p in this.pliki)
             {
                 try
                 {
                     p.ShowListViewFileInfo(listView1);
                 }
                 catch { }
             }
         }
		// Private Methods (2) 

        /// <summary>
        /// Metoda pomocnicza dla metody UstawKategorie
        /// Ustawia wszystkie pliki w folderze na kategorie
        /// przydielona folderowi
        /// </summary>
        /// <param name="f">Folder</param>
        /// <param name="kat">Kategoria</param>
        private static void PrzydzielKategorie(Folder f,Kategoria kat)
        {
            foreach (Plik p in f.Pliki)
            {
                p.Kategoria = kat;
            }
            foreach (Folder fold in f.Podflodery)
            {
                PrzydzielKategorie(fold, kat);
            }
        }

        /// <summary>
        /// Metoda pomocnicza dla właściwości Rozmiar.
        /// Zllicza rekurencyjnie rozmiar plików w danym folderze
        /// </summary>
        /// <param name="dir"></param>
        /// <returns></returns>
        private static long rozmiarRek(Folder dir)
        {
            long rozm = 0;
            foreach (Plik fi in dir.pliki)
            {
                try
                {
                    rozm += fi.Rozmiar;
                }
                catch { }
            }
            foreach (Folder di in dir.podfloldery)
            {
                try
                {
                    rozm += rozmiarRek(di);
                }
                catch { }
            }
            return rozm;
        }

		#endregion Methods 
    }
}
